package main

import (
	"fmt"
	"net"
	"time"
)

func main() {
	// 监听地址和端口
	host := "localhost"
	port := "7070"

	// 启动TCP服务器
	listener, err := net.Listen("tcp", host+":"+port)
	if err != nil {
		fmt.Println("Error listening:", err.Error())
		return
	}
	defer listener.Close()
	fmt.Println("Server listening on " + host + ":" + port)

	// 接受客户端连接并处理消息
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error accepting connection:", err.Error())
			return
		}
		go handleConnection(conn)
	}
}

// 处理连接
func handleConnection(conn net.Conn) {
	fmt.Println("New connection established from:", conn.RemoteAddr().String())
	// 设置超时时间为5秒
	conn.SetReadDeadline(time.Now().Add(5 * time.Second))
	// 循环读取客户端发送的消息
	for {
		buffer := make([]byte, 1024)
		n, err := conn.Read(buffer) //是的，conn.Read(buffer) 是一个阻塞的方法调用。当没有可读取的数据时，该方法将阻塞并等待数据的到达。
		if err != nil {
			// 处理错误
			if err, ok := err.(net.Error); ok && err.Timeout() {
				handleMessage(fmt.Sprintf("Read timeout occurred."))
			} else {
				handleMessage(fmt.Sprintf("Error reading:", err.Error()))
			}
			// 继续等待下一次超时
			conn.SetReadDeadline(time.Now().Add(5 * time.Second))
			continue
		}

		message := string(buffer[:n])
		handleMessage(fmt.Sprintf("Received message:", message))

		// 在这里可以根据需要对消息进行处理

		// 如果收到特定的结束标识，可以使用 break 退出循环，关闭连接
		if message == "quit" {
			break
		}
		// 重置超时时间为5秒
		conn.SetReadDeadline(time.Now().Add(5 * time.Second))
	}

	// 关闭连接
	conn.Close()
	handleMessage(fmt.Sprintf("Connection closed for:", conn.RemoteAddr().String()))
}

// 处理消息的回调函数
func handleMessage(message string) {

	currentTime := time.Now()
	timeString := currentTime.Format("2006-01-02 15:04:05")

	fmt.Println(timeString, ":Received message:", message)
}
